/**
 * 求[1,N]之间V字型数的数量
 * 实际上只有凸型不允许
 * 设Dijk, j是前一位，k是已有的趋势，用二进制位表示
 * 唯一的剪枝条件是前一位已有上升，而当前位是下降
 */
#include <bits/stdc++.h>
using namespace std;

using llt = long long;
llt const MOD = 1E9 + 7;

// Dij, i表示位数, j表示前一位, k表示趋势
// 0: null
// 1: 上升
// 2: 下降
// 4: 持平
llt D[110][10][8]; 
vector<int> G;
int const FULL = 10;

llt dfs(int pos, int pre, int qushi, bool lead, bool limit){
    if(-1 == pos){ // 前导0要去除
        return not lead ? 1 : 0;
    }
    if(not lead and not limit and -1 != D[pos][pre][qushi]){
        return D[pos][pre][qushi];
    }

    int last = limit ? G[pos] : FULL - 1;
    llt ans = 0;
    for(int i=0;i<=last;++i){
        if(0 == i and lead){
            ans += dfs(pos - 1, pre, qushi, true, limit&&last==i);
        }else{
            int nQushi = 4;
            if(not lead){ // 只有not lead才有前一位
                if(pre < i) nQushi = 1;      // 上升
                else if(i < pre) nQushi = 2; // 下降                
            }
            // 只有一种剪枝条件
            if((qushi & 1) and (nQushi & 2)) continue;
            ans += dfs(pos - 1, i, nQushi | qushi, false, limit&&last==i);
        }
        ans %= MOD;
    }

    if(not lead and not limit){
        D[pos][pre][qushi] = ans;
    }
    return ans;
}

llt digitDP(const string & S){
    G.clear();
    for(auto c : S) G.emplace_back(c - '0');
    reverse(G.begin(), G.end());
    auto t = dfs(G.size() - 1, 0, 0, true, true);
    return t;
}

string S;
void work(){
    cin >> S;
    auto t = digitDP(S);
    cout << t << "\n";
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
    memset(D, -1, sizeof(D));
    int nofkase = 1;
    cin >> nofkase;
    while(nofkase--) work();
	return 0;
}